package server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

public class IFMSocketServidor extends Thread{

    public static Vector CLIENTES;
    private static List LISTA_DE_NOMES = new ArrayList();
    private static ServerSocket serverSocket;

    private String nomeCliente;
    private Socket socket;

    //------------------------------------------------------//

    public IFMSocketServidor(Socket socket){
        this.socket = socket;
    }

    //------------------------------------------------------//

    public static void criaSocketServidor() throws IOException{
        serverSocket = new ServerSocket(7001);
    }
    public static Socket escutaCliente() throws IOException{
        Socket conexaoNova = serverSocket.accept();
        return conexaoNova;
        
    }


    //adiciona um nome novo na lista de nomes de clientes caso o nome ainda não esjeta contido nesta
    public boolean armazenaNomeLista(String nomeNovo){
        for(int i = 0; i<LISTA_DE_NOMES.size();i++){
            if(LISTA_DE_NOMES.get(i).equals(nomeNovo)) return true;
        }
        LISTA_DE_NOMES.add(nomeNovo);
        return false;
    }

    //remove um nome na lista de nomes de clientes
    public void removeNomeLista(String nome){
        for(int i = 0; i < LISTA_DE_NOMES.size(); i++){
            if(LISTA_DE_NOMES.get(i).equals(nome)) LISTA_DE_NOMES.remove(nome);
        }
    }


    @Override
    public void run(){
        try{
            BufferedReader entrada = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintStream saida = new PrintStream(socket.getOutputStream());

            this.nomeCliente = entrada.readLine();

            if(armazenaNomeLista(this.nomeCliente)){
                saida.println("Este nome já existe, conectnovamente com outro nome.");
                CLIENTES.add(saida);
                socket.close();
                return;
            }
            else{
                System.out.println(this.nomeCliente + " : Conectado ao Servidor!");
            }

            if(this.nomeCliente == null){
                return;
            }

            CLIENTES.add(saida);

            String mensagem = entrada.readLine();

            while(mensagem != null && !(mensagem.trim().equals(""))){
                sendToAll(saida, "escreveu: ", mensagem);
                mensagem = entrada.readLine();
            }

            System.out.println(this.nomeCliente + " saiu do bate-papo!");
            sendToAll(saida, " saiu", " do bate-papo!");
            removeNomeLista(this.nomeCliente);
            CLIENTES.remove(saida);
            socket.close();
            }

        catch(IOException e){
            System.out.println("Falha na Conexao... .. ."+" IOException: " + e);
            }


        }

    public void sendToAll(PrintStream saida, String acao, String mensagem)  throws IOException{
        Enumeration e =CLIENTES.elements();
            while(e.hasMoreElements()){
                PrintStream chat = (PrintStream) e.nextElement();
                if(chat != saida){
                    chat.println(this.nomeCliente + acao + mensagem);
                }
            }
        
    }
}
